package com.rpss.fichamento.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;

import com.rpss.fichamento.entidade.Fichamento;
import com.rpss.fichamento.entidade.Obra;

/**
 * <pre>
 * Repositorio para mes que utiliza o SQLite internamente
 * 
 * Para visualizar o banco pelo adb shell:
 * 
 * &gt;&gt; sqlite3 /data/data/com.rpss.contabilidadepessoal.banco/databases/BancoContabilidadePessoal
 * 
 * &gt;&gt; Mais info dos comandos em: http://www.sqlite.org/sqlite.html
 * 
 * &gt;&gt; .exit para sair
 * 
 * </pre>
 * 
 * @author rlecheta
 * 
 */
public class FichamentoDAO {
	private static final String CATEGORIA = "fichamento";

	// Nome do banco
	//private static final String NOME_BANCO = "fichamento";
	// Nome da tabela
	public static final String NOME_TABELA = "fichamento";
	
	public static String[] colunas = new String[] { "_id", "texto", "palavraschave", "id_obra"};
	
	private SQLiteDatabase db;

	public FichamentoDAO() {
		// Abre o banco de dados ja existente
		// db = ctx.openOrCreateDatabase(NOME_BANCO, Context.MODE_PRIVATE, null);
		Log.i(CATEGORIA, "in FichamentoDAO.Construtor 1");
		db = RepositorioFichamento.getDb();
		Log.i(CATEGORIA, "in FichamentoDAO.Construtor 1");
	}

	// Salva o carro, insere um novo ou atualiza
	public long salvar(Fichamento fichamento) {
		long id = fichamento.id;

		if (id != 0) {
			atualizar(fichamento);
		} else {
			// Insere novo
			id = inserir(fichamento);
		}

		return id;
	}

	// Insere um novo carro
	public long inserir(Fichamento fichamento) {
		ContentValues values = new ContentValues();
		values.put("texto", fichamento.texto);
		values.put("palavraschave", fichamento.palavrasChave);
		values.put("id_obra", fichamento.id_obra);

		long id = inserir(values);
		return id;
	}

	// Insere um novo carro
	public long inserir(ContentValues valores) {
		long id = db.insert(NOME_TABELA, "", valores);
		return id;
	}

	// Atualiza o carro no banco. O id do carro e utilizado.
	public int atualizar(Fichamento fichamento) {
		ContentValues values = new ContentValues();
		values.put("texto", fichamento.texto);
		values.put("palavraschave", fichamento.palavrasChave);

		String _id = String.valueOf(fichamento.id);

		String where = "_id = ?";
		String[] whereArgs = new String[] { _id };

		int count = atualizar(values, where, whereArgs);

		return count;
	}

	// Atualiza o carro com os valores abaixo
	// A clausula where e utilizada para identificar o mes a ser atualizado
	public int atualizar(ContentValues valores, String where, String[] whereArgs) {
		int count = db.update(NOME_TABELA, valores, where, whereArgs);
		Log.i(CATEGORIA, "Atualizou [" + count + "] registros");
		return count;
	}

	// Deleta o carro com o id fornecido
	public int deletar(long id) {
		String where = "_id = ?";

		String _id = String.valueOf(id);
		String[] whereArgs = new String[] { _id };

		int count = deletar(where, whereArgs);

		return count;
	}

	// Deleta o mes com os argumentos fornecidos
	public int deletar(String where, String[] whereArgs) {
		int count = db.delete(NOME_TABELA, where, whereArgs);
		Log.i(CATEGORIA, "Deletou [" + count + "] registros");
		return count;
	}

	// Busca o Mes pelo id
	public Fichamento buscarFichamento(long id) {
		// select * from meses where _id=?
		Cursor c = db.query(true, NOME_TABELA, colunas, " _id =" + id, null, null, null, null, null);

		if (c.getCount() > 0) {

			// Posicinoa no primeiro elemento do cursor
			c.moveToFirst();

			Fichamento fichamento = new Fichamento();

			// Le os dados
			fichamento.id = c.getLong(0);
			fichamento.texto = c.getString(1);
			fichamento.palavrasChave = c.getString(2);
			fichamento.id_obra = c.getLong(3);

			return fichamento;
		}

		return null;
	}

	// Retorna um cursor com todos os carros
	public Cursor getCursor(Long id_obra) {
		try {
			// select * from meses
			return db.query(NOME_TABELA, colunas, " id_obra =" + id_obra, null, null, null, Obras.DEFAULT_SORT_ORDER, null);
		} catch (SQLException e) {
			Log.e(CATEGORIA, "Erro ao buscar os meses: " + e.toString());
			return null;
		}
	}

	// Retorna uma lista com todos os carros
	public List<Fichamento> listarFichamentos(Obra obra) {
		Log.i(CATEGORIA, "in FichamentoDAO 1");
		Cursor c = getCursor(obra.id);
		Log.i(CATEGORIA, "in FichamentoDAO 2");
		List<Fichamento> fichamentos = new ArrayList<Fichamento>();
		Log.i(CATEGORIA, "in FichamentoDAO 3");
		if (c.moveToFirst()) {
			Log.i(CATEGORIA, "in FichamentoDAO 4");
			// Recupera os indices das colunas
			int idxId = c.getColumnIndex("_id");
			int idxTexto = c.getColumnIndex("texto");
			int idxPalavrasChave = c.getColumnIndex("palavraschave");
			int idxIdObra = c.getColumnIndex("id_obra");
			Log.i(CATEGORIA, "in FichamentoDAO 5");
			// Loop ate o final
			do {
				Fichamento fichamento = new Fichamento();
				fichamentos.add(fichamento);
				Log.i(CATEGORIA, "in FichamentoDAO 6");
				// recupera os atributos de carro
				fichamento.id = c.getLong(idxId);
				fichamento.texto = c.getString(idxTexto);
				fichamento.palavrasChave = c.getString(idxPalavrasChave);
				fichamento.id_obra = c.getLong(idxIdObra);
				Log.i(CATEGORIA, "in FichamentoDAO 7");
			} while (c.moveToNext());
			Log.i(CATEGORIA, "in FichamentoDAO 8");
		}
		Log.i(CATEGORIA, "in FichamentoDAO 9");
		return fichamentos;
	}

	// Busca o mes pelo mes "select * from carro where nome=?"
/*	public Obra buscarMesPorMESANO(Date mesAno) {
		Obra mes = null;

		try {
			// Idem a: SELECT _id,nome,placa,ano from CARRO where nome = ?
			Cursor c = db.query(NOME_TABELA, colunas, Obras.MESANO + "='" + mesAno.getTime() + "'", null, null, null, null);

			// Se encontrou...
			if (c.moveToNext()) {

				mes = new Obra();
				
				// utiliza os metodos getLong(), getString(), getInt(), etc para recuperar os valores
				mes.id = c.getLong(0);
				mes.mesAno = new Date(c.getLong(1));
			}
		} catch (SQLException e) {
			Log.e(CATEGORIA, "Erro ao buscar o mes pelo mes: " + e.toString());
			return null;
		}

		return mes;
	}
*/
	// Busca um carro utilizando as configuracoes definidas no
	// SQLiteQueryBuilder
	// Utilizado pelo Content Provider de carro
	public Cursor query(SQLiteQueryBuilder queryBuilder, String[] projection, String selection, String[] selectionArgs,
			String groupBy, String having, String orderBy) {
		Cursor c = queryBuilder.query(this.db, projection, selection, selectionArgs, groupBy, having, orderBy);
		return c;
	}
}